#ifndef _VL_RTSP_MEDIA_DISPATCHER__H_
#define _VL_RTSP_MEDIA_DISPATCHER__H_

#include "rtp.h"
#include "media_souce.h"

namespace VLRTSP {

/**
 * @Author: CimZzz
 * @Date: 2022-01-13 18:40:12
 * 
 * 媒体资源分发器
 * 支持 TCP / UDP 发送 RTP
 */
class MediaDispatcher {

public:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-13 19:32:31
	 * 
	 * 构造函数
	 * @param id 媒体分发器 Id
	 * @param rtpSendPoint RTP 发送端口 / Channel
	 * @param rtcpSendPoint RTCP 发送端口 / Channel
	 * @param mediaSource 媒体资源
	 */
	explicit MediaDispatcher(uint32_t id, uint16_t rtpSendPoint, uint16_t rtcpSendPoint, std::shared_ptr<MediaSource> mediaSource);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-13 19:32:40
	 * 
	 * 析构函数
	 */
	~MediaDispatcher();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-13 19:33:51
	 * 
	 * 分发数据帧
	 * @param rtpFram RTP 数据帧
	 */
	void dispatch(std::shared_ptr<RTPFrame> rtpFrame);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 16:53:06
	 * 
	 * 初始化数据分发器
	 * @return 如果初始化成功返回 true
	 */
	virtual bool init() { return true; }

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 11:48:47
	 * 
	 * 开始分发数据
	 */
	void start();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 17:11:23
	 * 
	 * 获取媒体数据分发器 Id
	 */
	uint32_t getDispatcherId();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 20:03:36
	 * 
	 * 获取 RTP 端口 / Channel
	 * @return RTP 端口 / Channel
	 */
	uint16_t getRTPStartPoint();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 20:03:57
	 * 
	 * 获取 RTCP 端口 / Channel
	 * @return RTCP 端口 / Channel
	 */
	uint16_t getRTCPStartPoint();

protected:

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 11:43:10
	 * 
	 * 消息队列回调函数
	 * @param sendBuffer 待发送的 RTP 帧
	 */
	virtual void onRecvSendBuffer(std::shared_ptr<RTPFrame>& sendBuffer) {};

private:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 14:37:44
	 * 
	 * 判断当前是否已经播放
	 */
	bool isPlaying;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 14:38:46
	 * 
	 * 播放状态线程锁
	 */
	std::mutex mutex;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 14:39:44
	 * 
	 * 回调编号
	 */
	uint32_t callbackCode;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 17:10:45
	 * 
	 * 媒体数据分发器 Id
	 */
	uint32_t id;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 11:37:03
	 * 
	 * RTP 发送端口 / Channel
	 */
	uint16_t rtpSendPoint;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 11:37:24
	 * 
	 * RTCP 发送端口 / Channel
	 */
	uint16_t rtcpSendPoint;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 11:50:11
	 * 
	 * 媒体资源
	 */
	std::shared_ptr<MediaSource> mediaSource;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 11:42:19
	 * 
	 * 发送消息队列
	 */
	QueueThread<RTPFrame> sendThread;
};

}


#endif //_VL_RTSP_MEDIA_DISPATCHER__H_
